//
//  ImageFilter.h
//  CoreImageDemno
//
//  Created by I4season on 14/07/2021.
//

#import <Foundation/Foundation.h>
#import <UIKit/UIKit.h>

@class CMImageFilter;
typedef CMImageFilter ImageFilter;

/// 饱和度 默认1
static CGFloat CMImageFilterDefaultSaturationValue = 1;
/// 亮度 默认0
static CGFloat CMImageFilterDefaultBrightnessValue = 0;
/// 对比度 默认1
static CGFloat CMImageFilterDefaultContrastValue = 1;

/// 图像大小变化通知
FOUNDATION_EXTERN NSNotificationName const _Nonnull CMImageFilterOriginalImageSizeChangedNotification;
FOUNDATION_EXTERN NSNotificationName const _Nonnull CMImageFilterProcessedImageSizeChangedNotification;

@interface CMImageFilter : NSObject

#pragma mark - 裁剪设置 优先级 0
/// 裁剪参数 有3种选择, 优先级如下
/// 1: cropRect,
/// 2: cropSquare + cropSquareSideLength/cropSquareSideLengthScale + cropCenter
/// 3: cropSize + cropSizeScale + cropCenter
/// 裁剪区域
@property (nonatomic, assign) CGRect cropRect;

/// 裁剪区域中心点 默认 {1, 1},在原图中心点, 任意大小裁剪,正方形裁剪皆依赖此值
@property (nonatomic, assign) CGPoint cropCenter;

/// 中心点 偏移 单位(px)
@property (nonatomic, assign) CGPoint cropCenterOffset;

///*************** 正方形裁剪
/// 裁剪区域 是否为正方形, 如设置为 YES,则 以cropCenter为中心,
/// 以cropSquareSideLength或cropSquareSideLengthScale为边长
@property (nonatomic, assign) BOOL cropSquare;
/// 正方形边长 实际长度
@property (nonatomic, assign) CGFloat cropSquareSideLength;
/// 正方形边长 以图片最短边长为除数的比例值, 如等于1,则为最大正方形
@property (nonatomic, assign) CGFloat cropSquareSideLengthScale;

///*************** 任意大小裁剪
/// 裁剪区域大小, 为具体数值, 优先级大于 cropMultiplierSize
@property (nonatomic, assign) CGSize cropSize;
/// 裁剪区域大小 为宽高为除数的比例值, 如 width=0.5,则裁剪区域宽度为原图宽度的一半.
@property (nonatomic, assign) CGSize cropSizeScale;

#pragma mark - 初始处理 优先级 1
/// 裁剪 --> 初始方向(initialAngle)
/// 默认图片方向
@property (nonatomic, assign) UIImageOrientation initialOrientation;

#pragma mark - 旋转角度 优先级 2
/// 初始角度
@property (nonatomic, assign) CGFloat initialAngle;
/// 旋转角度
@property (nonatomic, assign) CGFloat rotationAngle;

#pragma mark - 圆形遮罩 优先级 3
/// 裁剪区域 添加圆形滤镜, 如果图片是正方形,则为圆,矩形为椭圆,优先级 3
@property (nonatomic, assign) BOOL cropCircle;

/// 裁剪圆形区域外是否不透明, 设置为YES, 则圆形外的背景为黑色, 否侧为透明
@property (nonatomic, assign) BOOL cropCircleOpaque;

/// 裁剪圆形区域外颜色, 如果设置, 则忽略 cropCircleOpaque 属性
@property (nonatomic, strong) UIColor *cropCircleBackgroundColor;

#pragma mark - 图片方向镜像等 优先级 4
/// 图像方向
@property (nonatomic, assign) UIImageOrientation orientation;
/// 图像方向2 在1的基础上再次叠加
@property (nonatomic, assign) UIImageOrientation orientation2;

#pragma mark - 缩放
/// 缩放比例
@property (nonatomic, assign) CGFloat zoomScale;

#pragma mark - 滤镜
/// 单色滤镜, 原图设置nil, 黑白则设置为 black/grey, 其他颜色...
@property (nonatomic, assign) UIColor *colorMonochrome;

/// 饱和度 默认1
@property (nonatomic, assign) CGFloat colorSaturationValue;
/// 亮度 默认1
@property (nonatomic, assign) CGFloat colorBrightnessValue;
/// 对比度 默认1
@property (nonatomic, assign) CGFloat colorContrastValue;
/// 白平衡
@property (nonatomic, assign) CGFloat whiteBalance;

/// 通过设置SBC设置黑白图像
@property (nonatomic, assign) BOOL isGreyImage;

/// 浮雕效果
@property (nonatomic, assign) BOOL isRelief;

/// 负片效果
@property (nonatomic, assign) BOOL isInvert;

/// 是否添加角度指示器
@property (nonatomic, assign) BOOL isShowIndicator;
@property (nonatomic, strong) UIColor *indicatorColor;

/// 原图大小
@property (nonatomic, assign) CGSize originSize;
@property (nonatomic, assign) CGSize processedSize;

@property (class) CMImageFilter *share;

//- (instancetype)init UNAVAILABLE_ATTRIBUTE;

+ (instancetype)new UNAVAILABLE_ATTRIBUTE;

/// 恢复默认设置
- (void)resetDefault;

/// 提交滤镜设置
- (UIImage *)outputImageFromInputImage:(UIImage *)inputImage;

@end
